package study.corejava.innerclass;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.Timer;

/**
 * This program demonstrates the use of inner classes.
 * @version 1.10 2004-02-27
 * @author Cay Horstmann
 */
public class InnerClassTest {
	public static void main(String[] args) {
		TalkingClock2 clock2 = new TalkingClock2(1000, true);
		clock2.start();

		// keep program running until user selects "Ok"
		JOptionPane.showMessageDialog(null, "Quit program?");
		System.exit(0);
	}
}

/**
 * A clock that prints the time in regular intervals.
 */
class TalkingClock2 {
	/**
	 * Constructs a talking clock
	 * @param interval the interval between messages (in milliseconds)
	 * @param beep true if the clock should beep
	 */
	public TalkingClock2(int interval, boolean beep) {
		this.interval = interval;
		this.beep = beep;
	}

	/**
	 * Starts the clock.
	 */
	public void start() {
		
		//内部类的对象总有一个隐式的引用，它指向了创建它的外围类的对象
		ActionListener listener = new TimePrinter();
		
		Timer t = new Timer(interval, listener);
		t.start();
	}

	private int interval;
	private boolean beep;
	
	//内部类TimePrinter实现ActionListener接口(实现ActionListener接口就必须实现接口中的actionperformed方法)
	public class TimePrinter implements ActionListener {
		public void actionPerformed(ActionEvent event) {
			Date now = new Date();
			System.out.println("At the tone, the time is " + now);
			
			//内部类既可以访问自身的数据域，也可以直接访问创建它的外围类对象的数据域
			if (beep)
				Toolkit.getDefaultToolkit().beep();
		}
	}
}
